// 两种写法：

// - 在函数基础上 `分别指定` 参数和返回值类型
// - 使用类型别名 `同时指定` 参数和返回值类型

//  第一种写法
// 1.1  es的写法
function fn1(num1: number, num2: number): number {
  console.log(num1 + num2)

  return num1 + num2
}

fn1(1, 2)
fn1(10, 20)

//   es6 的写法   推荐  这种
let fn2 = (num1: number, num2: number): number => {
  return num1 + num2
}
fn2(10, 20)

// 第二种写法
type TypeFn = (num1: number, num2: number) => number

let fn3: TypeFn = (num1, num2) => {
  return num1 + num2
}

fn3(10, 20)

// 如果函数没有返回值，定义函数类型时返回值类型为 `void`
const sayHi = (msg: string): void => {
  console.log('嗨  坤坤   你好帅哦 ' + msg)
}

const sayHi2 = (msg: string) => {
  console.log('嗨  坤坤   你好帅哦 ' + msg)
}

sayHi('我想')

// 注意：

// - 在 `JS` 中如果没有返回值，默认返回的是 `undefined`
// - 但是 `void` 和 `undefined` 在 `TypeScript` 中并不是一回事
// - 如果指定返回值类型是 `undefined` 那返回值必须是 `undefined`

const sayHi3 = (): undefined => {
  return undefined
}

// 可选参数  采用 ?

const fn = (num?: number) => {
  console.log('fn')
}
fn()

fn(100)

const mySplie = (start?: number, end?: number): void => {
  console.log('start:' + start)

  console.log('end:' + end)
}

mySplie()
mySplie(1, 3)
mySplie(1)

// 必选参数不能位于可选参数后 `(start?: number, end: number)` 这样是不行的
const myIndexOf = (end: number, start?: number): void => {
  console.log('start:' + start)

  console.log('end:' + end)
}
